home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
shells
/
scsh-0.4
/
scsh-0
/
scsh-0.4.2
/
debug
/
mini-command.scm
< prev
next >
Wrap
Text File
|
1995-10-13
|
2KB
|
66 lines
; Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees. See file COPYING.
; Miniature command processor.
(define (command-processor ignore args)
(let ((in (current-input-port))
(out (current-output-port))
(batch? (member "batch" args)))
(let loop ()
((call-with-current-continuation
(lambda (go)
(with-handler
(lambda (c punt)
(cond ((or (error? c) (interrupt? c))
(display-condition c out)
(go (if batch?
(lambda () 1)
loop)))
((warning? c)
(display-condition c out))
(else (punt))))
(lambda ()
(if (not batch?) (display "- " out))
(let ((form (read in)))
(cond ((eof-object? form)
(newline out)
(go (lambda () 0)))
((and (pair? form) (eq? (car form) 'unquote))
(case (cadr form)
((load)
(mini-load in)
(go loop))
((go)
(let ((form (read in)))
(go (lambda ()
(eval form (interaction-environment))))))
(else (error "unknown command" (cadr form)))))
(else
(call-with-values
(lambda () (eval form (interaction-environment)))
(lambda results
(for-each (lambda (result)
(write result out)
(newline out))
results)
(go loop))))))))))))))
(define (mini-load in)
(let ((c (peek-char in)))
(cond ((char=? c #\newline) (read-char in) #t)
((char-whitespace? c) (read-char in) (mini-load in))
(else
(let ((filename (read-string in char-whitespace?)))
(load filename)
(mini-load in))))))
(define (read-string port delimiter?)
(let loop ((l '()) (n 0))
(let ((c (peek-char port)))
(cond ((or (eof-object? c)
(delimiter? c))
(list->string (reverse l)))
(else
(loop (cons (read-char port) l) (+ n 1)))))))